package br.com.mubi.usuario;

import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

import org.hibernate.exception.ConstraintViolationException;

import br.com.mubi.util.FacesUtil;

@ManagedBean(name = "usuarioBean")
@SessionScoped
public class UsuarioBean {
	private Usuario usuario;
	private String senhaAntiga;
	private String confirmaSenha;
	private List<Usuario> lista;
	private String destinoSalvar;
	private String msgInclusaoAlteracaoSucesso;
	private boolean areaSenha;
	
	public String novo() {
		this.destinoSalvar = "login";
		this.usuario = new Usuario();
		this.usuario.setAtivo(true);
		this.msgInclusaoAlteracaoSucesso = "Cadastro realizado com sucesso";
		return "cadastroUsuario";
	}
	
	public String editar() {
		this.destinoSalvar = "principal";
		UsuarioRN usuarioRN = new UsuarioRN();
		HttpServletRequest request = 
				(HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();		
		this.usuario = usuarioRN.buscarPorLogin(request.getRemoteUser());
		this.senhaAntiga = this.usuario.getSenha();
		this.confirmaSenha = this.usuario.getSenha();
		this.msgInclusaoAlteracaoSucesso = "Alteração realizada com sucesso";
		return "/restrito/atualizacaoConta.jsf";
	}
	
	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();		
		String senha = this.usuario.getSenha();
				
		if (!senha.equals(this.confirmaSenha)) {
			FacesUtil.addGrowlMessage(context, "A senha não foi confirmada corretamente.", FacesMessage.SEVERITY_WARN);
			return null;
		} else if(senha.contains(" ")){
			FacesUtil.addGrowlMessage(context, "A senha inválida.", FacesMessage.SEVERITY_WARN);
			return null;
		} else {
			if(senha.isEmpty() && this.usuario.getCodigo() != 0) {
				this.usuario.setSenha(this.senhaAntiga);
				this.confirmaSenha = this.senhaAntiga;
			}			
		}

		UsuarioRN usuarioRN = new UsuarioRN();		
		if(usuarioRN.validarCamposObrigatorios(this.usuario, context)) {
			try {
				usuarioRN.salvar(this.usuario);	
				FacesUtil.addGrowlMessage(context, this.msgInclusaoAlteracaoSucesso);
				return this.destinoSalvar;
			} catch (ConstraintViolationException exception) {
				FacesUtil.addGrowlMessage(context, "O usuário já existe.", FacesMessage.SEVERITY_WARN);
			}
		}

		return null;
	}
	
	public String ativar() {
		if (this.usuario.isAtivo())
			this.usuario.setAtivo(false);
		else
			this.usuario.setAtivo(true);
		
		UsuarioRN usuarioRN = new UsuarioRN();
		usuarioRN.salvar(this.usuario);
		return null;
	}
	
	public List<Usuario> getLista() {
		if (this.lista == null) {
			UsuarioRN usuarioRN = new UsuarioRN();
			this.lista = usuarioRN.listar();
		}
		return this.lista;
	}
	
	public String atribuiPermissao(Usuario usuario, String permissao) {
		this.usuario = usuario;
		Set<String> permissoes = this.usuario.getPermissao();
		if (permissoes.contains(permissao)) {
			permissoes.remove(permissao);
		} else {
			permissoes.add(permissao);
		}
		return null;
	}
	
	public void habilitarAreaSenha() {
		if(this.areaSenha) {
			this.areaSenha = false;
		} else {
			this.areaSenha = true;
		}
		
	}
	
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	public String getConfirmaSenha() {
		return confirmaSenha;
	}
	public void setConfirmaSenha(String confirmaSenha) {
		this.confirmaSenha = confirmaSenha;
	}
	public String getDestinoSalvar() {
		return destinoSalvar;
	}
	public void setDestinoSalvar(String destinoSalvar) {
		this.destinoSalvar = destinoSalvar;
	}

	public boolean isAreaSenha() {
		return areaSenha;
	}

	public void setAreaSenha(boolean areaSenha) {
		this.areaSenha = areaSenha;
	}

	public String getSenhaAntiga() {
		return senhaAntiga;
	}

	public void setSenhaAntiga(String senhaAntiga) {
		this.senhaAntiga = senhaAntiga;
	}
}
